home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 265_01 / cp3sctwr.c < prev    next >
Text File  |  1990-02-13  |  3KB  |  109 lines

  1. /*
  2. HEADER:        ;
  3. TITLE:        cpio "dump" for CP/M+
  4. VERSION:    
  5.  
  6. DESCRIPTION:    copies a cpio archive file to an 8" SSSD CPM disk in
  7.         drive C
  8.  
  9. KEYWORDS:    cpio, archive
  10. SYSTEM:        CP/M-80, V3.1
  11. FILENAME:    CP3SCTWR.C
  12. WARNINGS:    Requires Version 3.x of CP/M.  Overwrites disk in crive C,
  13.         without checking contents.  Interleave incompatible with
  14.         UNIX (TM)
  15.  
  16. SEE-ALSO:    SNAIDER.C
  17. AUTHORS:    Tim Prince (modified from Gerhards PC-DOS version)
  18. COMPILERS:    Eco-C, v2.48
  19.  
  20.  *    absolute sector write program
  21.  *    -----------------------------
  22.  *
  23.  *    written by    Rainer Gerhards
  24.  *            Petronellastr. 6
  25.  *            D-5112 Baesweiler
  26.  *            West Germany
  27. **
  28. **    CP/M+ version for Eco-C by
  29. **            Tim Prince
  30. **            4456 W. Maple Rd.
  31. **            Birmingham MI 48010-1923
  32.  */
  33.  
  34. #include <stdio.h>
  35.  
  36. #define DRIVEA    0
  37. #define DRIVEC    2
  38. #define SECTORS    26
  39. #define    TRACKS    77
  40. #define    MAXSECT    (TRACKS*SECTORS-1) /* maximum sectors accessible    */
  41. #define    SECTSIZE    128    /* OS sector size            */
  42.  
  43. static char        sectbuf[SECTSIZE];    /* must be in DS!    */
  44.  
  45. main(argc, argv)int argc;
  46. char    *argv[];
  47. {
  48. FILE    *fp;
  49. int    strtsect,i,numsect;
  50.  
  51. if(argc != 3)    {
  52.     fprintf(stderr, "Usage: sectwr filenam start-sector\n");
  53.     exit(1);
  54.     }
  55. if((fp = fopen(argv[1], "rb")) == NULL)    {
  56.     fprintf(stderr, "Can't open %s", argv[1]);
  57.     exit(1);
  58.     }
  59. if((strtsect= atoi(argv[2])) < 0 || strtsect > MAXSECT)    {
  60.     fprintf(stderr, "start-sector wrong.\n");
  61.     exit(1);
  62.     }
  63. for(numsect = 0 ; !feof(fp) ; ++numsect)    {
  64.     for(i = 0 ; i < SECTSIZE ; ++i)
  65.         sectbuf[i] = fgetc(fp);        /* ignore EOF    */
  66.     if(wrsct(strtsect, sectbuf))    {
  67.         fprintf(stderr, "error writing source disk!\n");
  68.         exit(2);
  69.         }
  70.     ++strtsect;
  71.     }
  72. printf("%d sectors written.\n", numsect);
  73. }
  74.  
  75. char **_bdos(); /* returns pointer or unsigned, depending on function */
  76. struct {    /* CP/M+ bios call parameter block */
  77.     char funct;
  78.     char areg;
  79.     unsigned bcreg;
  80.     char *dereg;
  81.     char *hlreg;    }pb;
  82.  
  83. char bios(fn,val) int fn,val;{
  84.     pb.funct=fn;
  85.     pb.bcreg=val; /* may be int or pointer */
  86.     (void)_bdos(50,&pb);
  87.     return pb.areg;}
  88.  
  89. char **seldsk(drive) int drive;{
  90.     pb.funct=9;
  91.     pb.bcreg=drive;
  92.     return _bdos(50,&pb);}
  93.  
  94. int sectran(sec,trans) unsigned sec; char *trans;{
  95.     pb.funct=16;
  96.     pb.bcreg=sec;
  97.     pb.dereg=trans;
  98.     return (int)_bdos(50,&pb);}
  99.  
  100. int wrsct(strtsect,sectbuf) int strtsect; char *sectbuf;{
  101.     int retval;
  102.     bios(10,strtsect/SECTORS);    /* track */
  103.     bios(11,sectran(strtsect%SECTORS,*seldsk(DRIVEC))); /* sector */
  104.     bios(12,sectbuf);        /* buffer */
  105.     retval=(bios(14,NULL)!=0);    /* write sector */
  106.     (void)seldsk((int)*(char *)4);    /* reset to match last BDOS select */
  107.     return retval;
  108. }
  109.